IPC机制: 线程之间的通信,指两个线程之间进行数据交换

队列的实现: 管道 + 锁

在队列中数据是安全的,因为队列中有锁的机制,保证多个线程修改同一块数据时,同一时间只能有一个任务可以进行修改

线程之间通信,直接使用 queue 模块

如果要实现线程之间的通信,就使用队列来实现就可以了,不要使用 Pipe管道 或者 Manager 来实现,因为数据不安全虽然可以加锁来实现数据安全,但是队列已经自带锁的机制了

1. queue.Queue() -> 先进先出

import queue

q = queue.Queue()

q.put('a')
q.put('b')
q.put('c')

print(q.qsize())  # 3

print(q.get())  # a
print(q.get())  # b
print(q.get())  # c

2. queue.LifoQueue() -> 后进先出

import queue

lfq = queue.LifoQueue()

lfq.put('a')
lfq.put('b')
lfq.put('c')

print(lfq.qsize())  # 3

print(lfq.get())  # c
print(lfq.get())  # b
print(lfq.get())  # a

3. queue.PriorityQueue() -> 根据权限输出,值越小越优先,值相同就根据 ascii 进行判断最小值先出

import queue

pq = queue.PriorityQueue()
pq.put((5, 'dd'))
pq.put((1, 'b'))
pq.put((1, 'aa'))

print(pq.qsize())  # 3

print(pq.get())  # (1, 'aa')
print(pq.get())  # (1, 'b')
print(pq.get())  # (5, 'dd')

4. 子线程与子线程之间的通讯

import queue
from threading import Thread


def fun1():
    q.put('hello')  # 将值添加到队列中 -> 直接调用外部的变量, 因为一个进程中的多个线程是可以直接使用这个进程中的数据,且一个py文件就相当于一个进程,不按照线程的说法: 函数本来就可以调用外部的变量和方法,因为作用域链


def fun2():
    print(q.get())  # 通过队列获取其他子线程的值 -> 直接调用外部的变量, 因为一个进程中的多个线程是可以直接使用这个进程中的数据,且一个py文件就相当于一个进程,不按照线程的说法: 函数本来就可以调用外部的变量和方法,因为作用域链


q = queue.Queue()
t1 = Thread(target=fun1)
t1.start()
t2 = Thread(target=fun2)
t2.start()